package com.wei.czz.common.enums.admin.menu;

import com.wei.czz.common.dto.common.NameValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wyw
 * date: 2024-06-13 11:44:14
 * className: MenuTypeEnum
 * version: 1.0
 * description:
 */
@Getter
@AllArgsConstructor
public enum MenuTypeEnum {

    PACKAGE_TYPE(0, "目录"),

    PAGE_TYPE(1, "页面"),

    BUTTON_TYPE(2, "按钮"),

    ;

    /**
     * 值
     */
    private final Integer value;

    /**
     * 名称
     */
    private final String name;

    /**
     * 获取名称
     * @param value 值
     * @return 名称
     */
    public static String getName(Integer value) {
        for (MenuTypeEnum menuTypeEnum : values()) {
            if (menuTypeEnum.value.equals(value)) {
                return menuTypeEnum.name;
            }
        }
        return "";
    }

    /**
     * 获取枚举列表
     */
    public static List<NameValue<Integer>> getList() {
        return Stream.of(values())
                .map(menuTypeEnum -> new NameValue<>(menuTypeEnum.name, menuTypeEnum.value))
                .collect(Collectors.toList());
    }

    /**
     * 获取枚举映射
     */
    public static Map<Integer, String> getMap() {
        return Stream.of(values())
                .collect(Collectors.toMap(MenuTypeEnum::getValue, MenuTypeEnum::getName, (a, b) -> b));
    }

    /**
     * 获取枚举映射
     */
    public static Map<String, MenuTypeEnum> getNameMap() {
        return Stream.of(values())
                .collect(Collectors.toMap(MenuTypeEnum::getName, Function.identity(), (a, b) -> b));
    }

    /**
     * 判断菜单’类型‘属性值是否正确
     * @param type 待校验的值
     * @return true-校验拒绝 false-校验通过
     */
    public static boolean isFail(Integer type) {
        for (MenuTypeEnum menuTypeEnum : values()) {
            if (menuTypeEnum.value.equals(type)) {
                return false;
            }
        }
        return true;
    }

}
